package com.cencat.user.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.cencat.common.response.PageResponse;
import com.cencat.user.dto.PermissionCreateDTO;
import com.cencat.user.dto.PermissionQueryDTO;
import com.cencat.user.dto.PermissionUpdateDTO;
import com.cencat.user.entity.Permission;
import com.cencat.user.vo.PermissionListVO;
import com.cencat.user.vo.PermissionVO;

import java.util.List;

/**
 * 权限服务接口
 * @author cencat
 * @since 2024-01-01
 */
public interface PermissionService {

    /**
     * 创建权限
     * @param dto 权限创建DTO
     * @return 权限ID
     */
    Long createPermission(PermissionCreateDTO dto);

    /**
     * 更新权限
     * @param dto 权限更新DTO
     * @return 是否成功
     */
    Boolean updatePermission(PermissionUpdateDTO dto);

    /**
     * 删除权限
     * @param id 权限ID
     * @param tenantId 租户ID
     * @return 是否成功
     */
    Boolean deletePermission(Long id, Long tenantId);

    /**
     * 批量删除权限
     * @param ids 权限ID列表
     * @param tenantId 租户ID
     * @return 是否成功
     */
    Boolean batchDeletePermissions(List<Long> ids, Long tenantId);

    /**
     * 根据ID获取权限详情
     * @param id 权限ID
     * @param tenantId 租户ID
     * @return 权限详情
     */
    PermissionVO getPermissionById(Long id, Long tenantId);

    /**
     * 分页查询权限列表
     * @param queryDTO 查询条件
     * @return 分页结果
     */
    PageResponse<PermissionListVO> getPermissionPage(PermissionQueryDTO queryDTO);

    /**
     * 查询权限列表
     * @param queryDTO 查询条件
     * @return 权限列表
     */
    List<PermissionListVO> getPermissionList(PermissionQueryDTO queryDTO);

    /**
     * 查询权限树形结构
     * @param tenantId 租户ID
     * @return 权限树形列表
     */
    List<PermissionVO> getPermissionTree(Long tenantId);

    /**
     * 启用权限
     * @param id 权限ID
     * @param tenantId 租户ID
     * @return 是否成功
     */
    Boolean enablePermission(Long id, Long tenantId);

    /**
     * 禁用权限
     * @param id 权限ID
     * @param tenantId 租户ID
     * @return 是否成功
     */
    Boolean disablePermission(Long id, Long tenantId);

    /**
     * 批量更新权限状态
     * @param ids 权限ID列表
     * @param status 状态（0-禁用，1-启用）
     * @param tenantId 租户ID
     * @return 是否成功
     */
    Boolean batchUpdatePermissionStatus(List<Long> ids, Integer status, Long tenantId);

    /**
     * 检查权限编码是否存在
     * @param permissionCode 权限编码
     * @param excludeId 排除的权限ID
     * @param tenantId 租户ID
     * @return 是否存在
     */
    Boolean checkPermissionCodeExists(String permissionCode, Long excludeId, Long tenantId);

    /**
     * 检查权限名称是否存在
     * @param permissionName 权限名称
     * @param excludeId 排除的权限ID
     * @param tenantId 租户ID
     * @return 是否存在
     */
    Boolean checkPermissionNameExists(String permissionName, Long excludeId, Long tenantId);

    /**
     * 根据父权限ID查询子权限列表
     * @param parentId 父权限ID
     * @param tenantId 租户ID
     * @return 子权限列表
     */
    List<PermissionVO> getChildrenByParentId(Long parentId, Long tenantId);

    /**
     * 根据权限类型查询权限列表
     * @param permissionType 权限类型
     * @param tenantId 租户ID
     * @return 权限列表
     */
    List<PermissionVO> getPermissionsByType(Integer permissionType, Long tenantId);

    /**
     * 根据用户ID查询用户权限
     * @param userId 用户ID
     * @param tenantId 租户ID
     * @return 权限列表
     */
    List<PermissionVO> getPermissionsByUserId(Long userId, Long tenantId);

    /**
     * 根据角色ID查询角色权限
     * @param roleId 角色ID
     * @param tenantId 租户ID
     * @return 权限列表
     */
    List<PermissionVO> getPermissionsByRoleId(Long roleId, Long tenantId);

    /**
     * 根据权限ID列表查询权限
     * @param permissionIds 权限ID列表
     * @param tenantId 租户ID
     * @return 权限列表
     */
    List<PermissionVO> getPermissionsByIds(List<Long> permissionIds, Long tenantId);

    /**
     * 检查是否有子权限
     * @param parentId 父权限ID
     * @param tenantId 租户ID
     * @return 是否有子权限
     */
    Boolean hasChildren(Long parentId, Long tenantId);

    /**
     * 获取权限统计信息
     * @param tenantId 租户ID
     * @return 统计信息
     */
    Long getPermissionCount(Long tenantId);

    /**
     * 根据权限编码查询权限
     * @param permissionCode 权限编码
     * @param tenantId 租户ID
     * @return 权限信息
     */
    PermissionVO getPermissionByCode(String permissionCode, Long tenantId);

    /**
     * 根据权限名称查询权限
     * @param permissionName 权限名称
     * @param tenantId 租户ID
     * @return 权限信息
     */
    PermissionVO getPermissionByName(String permissionName, Long tenantId);
}